<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <!-- 优点是
  解决了子类构造函数想父类构造函数传递参数
  可以实现多继承（call或者apply多个父类）
  缺点是
  方法都在构造函数中定义，无法复用
  不能继承原型属性/方法，只能继承父类的实例属性和方法
  就是父类的prototype上的属性和方法都不能用
  -->
  <script>
    function Father(name, age, sex) {
      this.name = name
      this.age = age
      this.sex = sex
    }
    Father.prototype.say = function () {
      console.log('说话');
    }

    function Father2(hobby) {
      this.hobby = hobby
      this.eat = () => {
        console.log("吃东西");
      }
    }

    function Son(name, age, sex, hobby) {
      // 这里使用son中的this，替换father中的this
      Father.call(this, name, age, sex)
      Father2.call(this, hobby)
    }

    let son = new Son('tom', 18, '男', "打篮球")
    console.log(son); //{name: 'tom', age: 18, sex: '男', hobby: '打篮球'}
    // son.say()  报错，不能继承
    // son.eat() //可以继承写死在构造函数内部的方法，但是会造成方法的重复申请
  </script>
</body>

</html>